package gf

import (
	"os"
)

// Echo 写入文件,当文件已存在则覆盖,当文件不存在则创建,默认权限: 0644
//
// 该方法首先检查文件是否存在，如果存在且没有错误，则删除文件。
// 最后，打印给定的文本。
func (fi *FileStatus) Echo(text string) {
	// 检查文件是否存在。
	fi.Exists()
	// 如果没有错误，即文件存在，尝试删除文件。
	if fi.Err == nil {
		fi.DeleteFile()
	}
	// 无论文件是否存在或是否删除成功，最终打印给定的文本。
	fi.textCover(text)
}

// Echo 将指定的文本写入指定的文件中。
// 如果文件不存在，会尝试创建该文件。
// 参数:
//
//	filename - 要写入的文件名。
//	text - 要写入文件的文本内容。
//
// 返回值:
//
//	如果写入过程中发生错误，返回该错误；否则返回nil。
func Echo(filename, text string) error {
	// 创建一个File实例，关联到指定的文件名。
	fi := NewFile(filename)
	// 将文本内容写入文件。
	fi.Echo(text)
	// 返回写入操作可能产生的错误。
	return fi.Err
}

// Write 将指定的文本写入指定的文件中。
// 如果文件不存在，会尝试创建该文件。
// 参数:
//
//	filename - 要写入的文件名。
//	text - 要写入文件的文本内容。
//
// 返回值:
//
//	如果写入过程中发生错误，返回该错误；否则返回nil。
func Write(filename, text string) error {
	// 创建一个File实例，关联到指定的文件名。
	fi := NewFile(filename)
	// 将文本内容写入文件。
	fi.Echo(text)
	// 返回写入操作可能产生的错误。
	return fi.Err
}

// EchoAdd 写入文本到文件中,当文件已存在则追加,当文件不存在则创建,默认权限: 0644
// 参数:
//
//	text - 要添加的文本字符串。
//	wrap - 布尔值，决定是否在文本末尾添加换行符。
func (fi *FileStatus) EchoAdd(txt string, wrap bool) {
	// 当wrap参数为true时，表示需要换行。
	if wrap {
		// 如果启用换行则在字符串末尾增加换行符
		text := txt + "\n"
		fi.textCover(text)
	} else {
		// 如果不需要换行，则直接调用textCover方法。
		fi.textCover(txt)
	}

}

// EchoAdd 将指定的文本内容添加到给定的文件中。
// 参数：
//
//	filename - 要写入的文件名。
//	text - 要添加到文件中的文本内容。
//	wrap - 决定是否在文本末尾添加换行符的布尔值。
//
// 返回：
//
//	可能发生的错误，如果没有错误，则为nil。
func EchoAdd(filename, text string, wrap bool) error {
	// 创建一个文件实例。
	fi := NewFile(filename)
	// 调用文件实例的EchoAdd方法添加文本内容。
	fi.EchoAdd(text, wrap)
	// 返回可能发生的错误。
	return fi.Err
}

// Touch 检查文件是否存在，如果不存在则创建它
// 这个方法主要用于确认文件是否存在，如果不存在则创建一个新文件，不会返回任何数据
func (fi *FileStatus) Touch() {
	// 调用 Exists 方法检查文件是否存在
	fi.Exists()
	// 如果文件存在，则直接返回，无需创建新文件
	if fi.ExIst {
		return
	}
	// 如果文件不存在，尝试创建文件
	// os.O_WRONLY 表示以写入模式打开文件
	// os.O_CREATE 表示如果文件不存在则创建文件
	// fi.Perm 指定了文件的权限设置
	fi.open, fi.Err = os.OpenFile(fi.FileName, os.O_WRONLY|os.O_CREATE, fi.Perm)
	// 关闭文件
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
			return
		}
	}(fi.open)
}

// Touch 尝试创建或更新指定文件的访问时间，类似于Unix的touch命令。
// 如果文件已存在，则更新其访问时间；如果文件不存在，则创建一个新文件。
// 参数:
//
//	filename: 需要创建或更新的文件名。
//
// 返回值:
//
//	error: 如果文件操作失败，则返回错误信息。
func Touch(filename string) error {
	// 创建一个新的文件对象。
	f := NewFile(filename)
	// 调用文件对象的Touch方法来创建或更新文件。
	f.Touch()
	// 返回文件操作可能产生的错误。
	return f.Err
}
